Android — 初始 JNI 和 NDK

前言

最近热修复和插件化炒得火热,是时候头铁开始尝试学习了。那么他们有什么用途吗?

在热修复出现之前,一个已经上线的 APP 如果出现了 Bug,即使是一个非常小的 Bug,不及时更新的话有可能存在风险,若要及时更新就得将 APP 重新打包发布到应用市场,让用户再一次下载,这就大大降低了用户体验,当热修复出现之后,这样的问题就不再是问题了。

对于插件化,如其名,一个程序划分为不同的部分,以插件的形式加载到应用中去,本质上它使用的技术还是热修复技术,只不过是加入了更多的工程实践,让它支持大规模的代码更新以及资源和 so 包的更新。

然而要想更加容易理解热修复和插件化,还是要先学好 JNI 和 NDK 知识的。但是我对 JNI 和 NDK 完全不知呀,不慌不慌,撸会猫,然后一起学习。

什么是 JNI?

全称是 Java native interface,Java 本地开发接口。JNI 是一个协议,这个协议用来沟通 Java 代码和外部的本地代码 ( C/C++ ),通过这个协议,Java 代码可以调用外部的 C/C++ 代码,外部的 C/C++ 代码也可以调用本地的 Java 代码。

什么是 NDK?

全称是 Native Development Kit。NDK 允许用户使用类似 C/C++ 之类的原生代码执行部分程序,NDK 包括了从 C/C++ 生成原生代码库所需的工具和 build files。NDK 是一系列工具的集合,能够帮助开发者快速开发 C/C++ 的动态库,并能自动将 so 和 java 应用一起打包成 apk。

为什么要用 NDK?

  1. 代码的保护,由于 apk 的 java 层代码很容易被反编译,而 C/C++ 库被反编译的难度较大。
  2. 在 NDK 中调用第三方 C/C++ 库,因为大部分的开源库都是用 C/C++ 代码编写的。
  3. 便于移植,用 C/C++ 写的库可以方便在其他的嵌入式平台上再次使用。
  4. 提升效率,Java 代码是跨平台的,不直接操作硬件。由 Dalvik 虚拟机解释执行,而 IOS 对 objectC 可直接操作硬件,可手动去释放内存,效率比较高。

配置 NDK 开发环境:

Android Studio 目前有两种方式配置 NDK 的开发环境,传统模式和 CMake 方式。传统方式需要配置 Android,mk、Application.mk和gradle,这种方式复杂繁琐。下面介绍 CMake 方式 ( 在 Android Studio 3.0 上实验成功 ):

  1. 在新建工程时选中 Include C++ support
  2. 下载 CMake

在执行一的时候,编译器会自动帮你检查是否有 NDK,点击下载就好了,但是最后还是报错:

1
Error:Unable to get the CMake version located at:D:\\AndroidSDK\

它不会给你点击下载,所以 File –> Settings –> ↓

然后运行项目,你就会看到:

Hello from C++

参考:

NDK探究之旅《一》——对jni和NDK的认识

Android NDK底层开发初识介绍

热修复插件化学习流程

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?